import api from '@/utils/api'

/**
 * 获取报表数据
 * @param {string} type - 报表类型
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {Object} params - 其他参数
 * @returns {Promise} - 返回报表数据
 */
export function getReportData(type, startDate, endDate, params = {}) {
  // 将新的报表类型映射到系统中已有的API端点
  const apiEndpointMap = {
    'daily-summary': '/reports/daily',
    'receipt-details': '/reports/transactions',
    'sales-overview': '/reports/sales-overview',
    'product-analysis': '/reports/product-analysis',
    'hourly-analysis': '/reports/hourly-analysis',
    'category-analysis': '/reports/category-analysis',
    'channel-analysis': '/reports/channel-analysis',
    'payment-analysis': '/reports/payment-analysis',
    'profit-loss': '/reports/profit-loss'
  };

  // 构建API路径
  const apiEndpoint = apiEndpointMap[type] || '/reports';

  // 特殊处理日报API调用
  if (type === 'daily-summary') {
    // 日报API期望单个date参数，如果startDate和endDate相同，使用date参数
    if (startDate === endDate) {
      return api.get(apiEndpoint, {
        params: {
          date: startDate,
          ...params
        }
      });
    } else {
      // 如果是日期范围，使用startDate和endDate
      return api.get(apiEndpoint, {
        params: {
          startDate,
          endDate,
          ...params
        }
      });
    }
  }

  // 调用实际API
  return api.get(apiEndpoint, {
    params: {
      startDate,
      endDate,
      ...params
    }
  }).catch(error => {
    console.error(`获取${type}报表失败:`, error);
    // 返回一个带有错误信息的响应，避免前端崩溃
    return {
      data: {
        status: 'error',
        data: {
          message: `获取${type}报表失败: ${error.message || '服务器错误'}`,
          error: true
        }
      }
    };
  });
}

/**
 * 获取销售概览报表
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {string} timeUnit - 时间单位 (daily, weekly, monthly)
 * @param {string} channel - 渠道ID
 * @returns {Promise} - 返回销售概览报表数据
 */
export function getSalesOverview(startDate, endDate, timeUnit = 'daily', channel = 'all') {
  return getReportData('sales-overview', startDate, endDate, { timeUnit, channel });
}

/**
 * 获取时段销售分析报表
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {Array} weekdays - 星期几的数组 [0,1,2,3,4,5,6]，0表示周日
 * @returns {Promise} - 返回时段销售分析报表数据
 */
export function getHourlySalesAnalysis(startDate, endDate, weekdays = []) {
  return getReportData('hourly-analysis', startDate, endDate, { 
    weekdays: weekdays.join(',')
  });
}

/**
 * 获取商品销售排行榜
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {string} categoryId - 分类ID
 * @param {string} channelId - 渠道ID
 * @param {string} sortBy - 排序字段 (salesAmount, quantity, profit)
 * @param {number} limit - 返回数量限制
 * @returns {Promise} - 返回商品销售排行榜数据
 */
export function getProductRanking(startDate, endDate, categoryId = 'all', channelId = 'all', sortBy = 'salesAmount', limit = 10) {
  return getReportData('product-ranking', startDate, endDate, {
    categoryId,
    channelId,
    sortBy,
    limit
  });
}

/**
 * 获取商品销售趋势
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {Array} productIds - 商品ID数组
 * @param {string} timeUnit - 时间单位 (daily, weekly, monthly)
 * @returns {Promise} - 返回商品销售趋势数据
 */
export function getProductSalesTrend(startDate, endDate, productIds = [], timeUnit = 'daily') {
  return getReportData('product-sales-trend', startDate, endDate, {
    productIds: productIds.join(','),
    timeUnit
  });
}

/**
 * 获取商品组合分析
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {string} mainProductId - 主商品ID
 * @param {number} limit - 返回数量限制
 * @returns {Promise} - 返回商品组合分析数据
 */
export function getProductCombination(startDate, endDate, mainProductId = null, limit = 10) {
  return getReportData('product-combination', startDate, endDate, {
    mainProductId,
    limit
  });
}

/**
 * 获取分类销售占比
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {string} channelId - 渠道ID
 * @returns {Promise} - 返回分类销售占比数据
 */
export function getCategorySalesRatio(startDate, endDate, channelId = 'all') {
  return getReportData('category-sales-ratio', startDate, endDate, {
    channelId
  });
}

/**
 * 获取分类销售趋势
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {Array} categoryIds - 分类ID数组
 * @param {string} timeUnit - 时间单位 (daily, weekly, monthly)
 * @returns {Promise} - 返回分类销售趋势数据
 */
export function getCategorySalesTrend(startDate, endDate, categoryIds = [], timeUnit = 'daily') {
  return getReportData('category-sales-trend', startDate, endDate, {
    categoryIds: categoryIds.join(','),
    timeUnit
  });
}

/**
 * 获取渠道销售对比
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {Array} channelIds - 渠道ID数组
 * @returns {Promise} - 返回渠道销售对比数据
 */
export function getChannelSalesComparison(startDate, endDate, channelIds = []) {
  return getReportData('channel-sales-comparison', startDate, endDate, {
    channelIds: channelIds.join(',')
  });
}

/**
 * 获取支付方式占比
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {string} channelId - 渠道ID
 * @returns {Promise} - 返回支付方式占比数据
 */
export function getPaymentMethodRatio(startDate, endDate, channelId = 'all') {
  return getReportData('payment-method-ratio', startDate, endDate, {
    channelId
  });
}

/**
 * 获取损益表报表
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {string} periodType - 期间类型 (daily, weekly, monthly, quarterly, yearly)
 * @param {string} comparisonType - 对比类型 (previous, samePeriodLastYear, none)
 * @returns {Promise} - 返回损益表报表数据
 */
export function getProfitLossStatement(startDate, endDate, periodType = 'monthly', comparisonType = 'previous') {
  return getReportData('profit-loss', startDate, endDate, {
    periodType,
    comparisonType
  });
}

/**
 * 导出报表
 * @param {string} type - 报表类型
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {string} format - 导出格式 (excel, pdf, csv)
 * @param {Object} params - 其他参数
 * @returns {Promise} - 返回二进制数据流
 */
export function exportReport(type, startDate, endDate, format = 'excel', params = {}) {
  // 根据报表类型选择不同的API端点
  let url = '/reports/v2/export';
  
  // 使用特定的导出端点
  if (type === 'receipt-details') {
    url = '/reports/transactions/export';
  } else if (type === 'daily-summary') {
    // 判断是否为日期范围
    if (startDate !== endDate) {
      // 使用日期范围导出接口
      url = '/reports/daily/range/export';
    } else {
      // 使用单日导出接口
      url = '/reports/daily/' + startDate + '/export';
    }
  }
  
  return api.get(url, {
    params: {
      type,
      startDate,
      endDate,
      format,
      ...params
    },
    responseType: 'blob' // 重要：指定响应类型为blob
  })
  .then(response => {
    try {
      // 检查响应类型
      if (!response.data || response.headers['content-type'] !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
        console.warn('导出响应类型不正确:', response.headers['content-type']);
      }
      
      // 创建blob链接并触发下载
      const blob = new Blob([response.data], { 
        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
      });
      
      // 使用更安全的方式处理下载
      const url = URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = url;
      
      // 设置文件名
      let fileName = `${type}-${startDate}-${endDate}.xlsx`;
      if (type === 'receipt-details') {
        fileName = `transactions-${startDate}-${endDate}.xlsx`;
      } else if (type === 'daily-summary') {
        if (startDate === endDate) {
          fileName = `daily-report-${startDate}.xlsx`;
        } else {
          fileName = `daily-report-${startDate}-to-${endDate}.xlsx`;
        }
      }
      
      link.setAttribute('download', fileName);
      
      // 添加到DOM并触发点击
      document.body.appendChild(link);
      link.click();
      
      // 清理URL对象，防止内存泄漏
      setTimeout(() => {
        document.body.removeChild(link);
        URL.revokeObjectURL(url);
      }, 100);
      
      return response;
    } catch (err) {
      console.error('处理导出文件时出错:', err);
      throw err;
    }
  })
  .catch(error => {
    console.error('导出报表失败:', error);
    // 如果错误有响应体，尝试解析错误信息
    if (error.response && error.response.data) {
      // 如果响应是Blob类型，需要转换为文本来读取错误信息
      if (error.response.data instanceof Blob) {
        const reader = new FileReader();
        reader.onload = () => {
          try {
            const errorData = JSON.parse(reader.result);
            // 可以在这里显示错误消息
            console.error('导出错误详情:', errorData);
          } catch (e) {
            console.error('无法解析错误响应:', e);
          }
        };
        reader.readAsText(error.response.data);
      }
    }
    throw error;
  });
}

/**
 * 导出损益表
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @param {string} periodType - 期间类型 (daily, weekly, monthly, quarterly, yearly)
 * @param {string} format - 导出格式 (excel, pdf, csv)
 * @returns {Promise} - 返回二进制数据流
 */
export function exportProfitLossStatement(startDate, endDate, periodType = 'monthly', format = 'excel') {
  return exportReport('profit-loss', startDate, endDate, format, { periodType });
}

/**
 * 导出美化版日报
 * @param {string} date - 日期 YYYY-MM-DD
 * @returns {Promise} - 返回二进制数据流
 */
export function exportEnhancedDailyReport(date) {
  return api.get(`/reports-enhanced/daily/${date}/export-enhanced`, {
    responseType: 'blob' // 重要：指定响应类型为blob
  })
  .then(response => {
    try {
      // 检查响应类型
      if (!response.data || response.headers['content-type'] !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
        console.warn('导出响应类型不正确:', response.headers['content-type']);
      }
      
      // 创建blob链接并触发下载
      const blob = new Blob([response.data], { 
        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
      });
      
      // 使用更安全的方式处理下载
      const url = URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = url;
      
      // 设置文件名
      const fileName = `哈喽啤鲜生销售日报-${date}.xlsx`;
      link.setAttribute('download', fileName);
      
      // 添加到DOM并触发点击
      document.body.appendChild(link);
      link.click();
      
      // 清理URL对象，防止内存泄漏
      setTimeout(() => {
        document.body.removeChild(link);
        URL.revokeObjectURL(url);
      }, 100);
      
      return response;
    } catch (err) {
      console.error('处理导出文件时出错:', err);
      throw err;
    }
  })
  .catch(error => {
    console.error('导出美化版日报失败:', error);
    throw error;
  });
}

/**
 * 导出美化版日期范围日报
 * @param {string} startDate - 开始日期 YYYY-MM-DD
 * @param {string} endDate - 结束日期 YYYY-MM-DD
 * @returns {Promise} - 返回二进制数据流
 */
export function exportEnhancedDailyRangeReport(startDate, endDate) {
  // 确保日期格式正确
  console.log('导出美化版日期范围日报，原始参数:', { startDate, endDate });
  
  // 如果是日期对象，转换为YYYY-MM-DD格式的字符串
  if (startDate instanceof Date) {
    startDate = startDate.toISOString().split('T')[0];
  }
  
  if (endDate instanceof Date) {
    endDate = endDate.toISOString().split('T')[0];
  }
  
  console.log('导出美化版日期范围日报，处理后参数:', { startDate, endDate });
  
  return api.get(`/reports-enhanced/daily/range/export-enhanced`, {
    params: {
      startDate,
      endDate
    },
    responseType: 'blob' // 重要：指定响应类型为blob
  })
  .then(response => {
    try {
      // 检查响应类型
      if (!response.data || response.headers['content-type'] !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
        console.warn('导出响应类型不正确:', response.headers['content-type']);
      }
      
      // 创建blob链接并触发下载
      const blob = new Blob([response.data], { 
        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
      });
      
      // 使用更安全的方式处理下载
      const url = URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = url;
      
      // 设置文件名
      const fileName = `哈喽啤鲜生销售日报-${startDate}-to-${endDate}.xlsx`;
      link.setAttribute('download', fileName);
      
      // 添加到DOM并触发点击
      document.body.appendChild(link);
      link.click();
      
      // 清理URL对象，防止内存泄漏
      setTimeout(() => {
        document.body.removeChild(link);
        URL.revokeObjectURL(url);
      }, 100);
      
      return response;
    } catch (err) {
      console.error('处理导出文件时出错:', err);
      throw err;
    }
  })
  .catch(error => {
    console.error('导出美化版日期范围日报失败:', error);
    throw error;
  });
}

/**
 * 获取月度报表
 * @param {number} year - 年份
 * @param {number} month - 月份
 * @returns {Promise} - 返回月度报表数据
 */
export function getMonthlyReport(year, month) {
  return api.get('/reports/monthly', {
    params: { year, month }
  }).catch(error => {
    console.error('获取月度报表失败:', error);
    return {
      data: {
        status: 'error',
        data: {
          message: `获取月度报表失败: ${error.message || '服务器错误'}`,
          error: true
        }
      }
    };
  });
}

/**
 * 获取年度报表
 * @param {number} year - 年份
 * @returns {Promise} - 返回年度报表数据
 */
export function getYearlyReport(year) {
  return api.get('/reports/yearly', {
    params: { year }
  }).catch(error => {
    console.error('获取年度报表失败:', error);
    return {
      data: {
        status: 'error',
        data: {
          message: `获取年度报表失败: ${error.message || '服务器错误'}`,
          error: true
        }
      }
    };
  });
}

export default {
  getReportData,
  getSalesOverview,
  getHourlySalesAnalysis,
  getProductRanking,
  getProductSalesTrend,
  getProductCombination,
  getCategorySalesRatio,
  getCategorySalesTrend,
  getChannelSalesComparison,
  getPaymentMethodRatio,
  getProfitLossStatement,
  getMonthlyReport,
  getYearlyReport,
  exportReport,
  exportProfitLossStatement,
  exportEnhancedDailyReport,
  exportEnhancedDailyRangeReport
};